package model;

import java.io.Serializable;

public class Coordonnee implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -2617066489198974310L;
	private int largeur = -1;
	private int hauteur = -1;
	private int largeurMax = -1;
	private int hauteurMax = -1;

	public Coordonnee(int hauteur, int largeur, int hauteurMax, int largeurMax) {
		this.largeur = largeur;
		this.hauteur = hauteur;
		this.largeurMax = largeurMax;
		this.hauteurMax = hauteurMax;
		if (Rules.haveTor()) {
			if (largeur >= largeurMax)
				this.largeur = 0;
			if (largeur < 0)
				this.largeur = largeurMax - 1;
			if (hauteur >= hauteurMax)
				this.hauteur = 0;
			if (hauteur < 0)
				this.hauteur = hauteurMax - 1;
			this.largeurMax = largeurMax;
			this.hauteurMax = hauteurMax;
		}
	}

	public Coordonnee(int x, int hauteurMax, int largeurMax) {
		this.largeurMax = largeurMax;
		this.hauteurMax = hauteurMax;
		largeur = x % this.largeurMax;
		hauteur = x / this.largeurMax;
		if (Rules.haveTor()) {
			if (largeur >= largeurMax)
				this.largeur = 0;
			if (largeur < 0)
				this.largeur = largeurMax - 1;
			if (hauteur >= hauteurMax)
				this.hauteur = 0;
			if (hauteur < 0)
				this.hauteur = hauteurMax - 1;
		}
	}

	@Override
	public int hashCode() {
		if (this.largeur == -1 || this.hauteur == -1 || this.largeurMax == -1)
			return -1;
		return this.largeur + this.hauteur * this.largeurMax;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj.getClass() != this.getClass())
			return false;
		if (this.hashCode() == obj.hashCode())
			return true;
		return false;
	};

	@Override
	public String toString() {
		return "Hauteur " + this.hauteur + " et Largeur " + this.largeur + " ";

	}

	/**
	 * @return the largeur
	 */
	public int getLargeur() {
		return largeur;
	}

	/**
	 * @return the hauteur
	 */
	public int getHauteur() {
		return hauteur;
	}

	/**
	 * @return the largeurMax
	 */
	public int getLargeurMax() {
		return largeurMax;
	}

	/**
	 * @return the largeurMax
	 */
	public int getHauteurMax() {
		return hauteurMax;
	}

	public boolean isValid() {
		if (largeur >= 0 && largeur < largeurMax && hauteur >= 0
				&& hauteur < hauteurMax)
			return true;
		return false;
	}

	public Coordonnee relative(Coordonnee coord) {
		int haut = coord.hauteur + this.hauteur - this.hauteurMax / 2;
		int larg = coord.largeur + this.largeur - this.largeurMax / 2;
		if (Rules.haveTor()) {
			if (larg < 0)
				larg = coord.largeurMax + larg;
			if (larg > coord.largeurMax - 1)
				larg = larg - coord.largeurMax;
			if (haut < 0)
				haut = coord.hauteurMax + larg;
			if (haut > coord.hauteurMax - 1)
				haut = haut - coord.hauteurMax;
		}
		Coordonnee c = new Coordonnee(haut, larg, coord.hauteurMax,
				coord.largeurMax);
		return c;
	}
}
